bin/refs: Allow overwriting existing ref
authorDan Nicholson <nicholson@endlessm.com>
Mon, 10 Jun 2019 14:47:44 +0000 (09:47 -0500)
committerAtomic Bot <atomic-devel@projectatomic.io>
Wed, 12 Jun 2019 15:00:19 +0000 (15:00 +0000)
Currently if you want to update a non-alias ref, you need to first check
if it exists and use either `ostree refs --create` or `ostree reset` as
appropriate. That's unnecessarily complicated and is much less
convenient than the old `write-refs` builtin that simply called
`ostree_repo_set_ref_immediate()` without any checks.

Add a `--force` option to be used with `--create` that does not raise an
error when the destination ref already exists.

Closes: #1870
Approved by: jlebon

bash/ostree
man/ostree-refs.xml
src/ostree/ot-builtin-refs.c
tests/test-refs.sh

index 5ba3d4759f236f3a0bb2dabc6b2ebbbf6ad17f89..fc429983762b4d859a7138692a90bda9f0915243 100644 (file)
@@ -952,6 +952,7 @@ _ostree_refs() {
         --collections -c
         --delete
         --list
+        --force
     "
 
     local options_with_args="
index 8d5a1d235637fa3cefa53c588c60517fd6ca6337..0ba6b1d76e56ee9121ea17aa8f57fc66ee358f12 100644 (file)
@@ -126,6 +126,16 @@ Boston, MA 02111-1307, USA.
                   PREFIX are deleted.
                 </para></listitem>
             </varlistentry>
+
+            <varlistentry>
+                <term><option>--force</option></term>
+
+                <listitem><para>
+                  When creating <literal>NEWREF</literal> with
+                  <option>--create</option>, allow an existing ref to be
+                  updated instead of erroring.
+                </para></listitem>
+            </varlistentry>
         </variablelist>
     </refsect1>
 
index 630605a03a52d46df174981cb4d391f7a3cdb05d..1e0b10116433d51c4e70f317f8de2296f8584d09 100644 (file)
@@ -32,6 +32,7 @@ static gboolean opt_list;
 static gboolean opt_alias;
 static char *opt_create;
 static gboolean opt_collections;
+static gboolean opt_force;
 
 /* ATTENTION:
  * Please remember to update the bash-completion script (bash/ostree) and
@@ -44,6 +45,7 @@ static GOptionEntry options[] = {
   { "alias", 'A', 0, G_OPTION_ARG_NONE, &opt_alias, "If used with --create, create an alias, otherwise just list aliases", NULL },
   { "create", 0, 0, G_OPTION_ARG_STRING, &opt_create, "Create a new ref for an existing commit", "NEWREF" },
   { "collections", 'c', 0, G_OPTION_ARG_NONE, &opt_collections, "Enable listing collection IDs for refs", NULL },
+  { "force", 0, 0, G_OPTION_ARG_NONE, &opt_force, "Overwrite existing refs when creating", NULL },
   { NULL }
 };
 
@@ -89,7 +91,7 @@ do_ref_with_collections (OstreeRepo    *repo,
           else goto out;
         }
 
-      if (checksum_existing != NULL)
+      if (!opt_force && checksum_existing != NULL)
         {
           g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
                        "--create specified but ref %s already exists", opt_create);
@@ -205,9 +207,11 @@ static gboolean do_ref (OstreeRepo *repo, const char *refspec_prefix, GCancellab
           else goto out;
         }
 
-      /* We want to allow replacing an existing alias */
+      /* We want to allow replacing an existing alias or a normal ref when
+       * forced
+       */
       gboolean replacing_alias = opt_alias && g_hash_table_contains (ref_aliases, opt_create);
-      if (!replacing_alias && checksum_existing != NULL)
+      if (!replacing_alias && !opt_force && checksum_existing != NULL)
         {
           g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
                        "--create specified but ref %s already exists", opt_create);
index 83da04ff53d3614958a5dec7cdcdb499cab67677..d0f8e7da5df3e850375b08b776b74ce422109ccf 100755 (executable)
@@ -90,6 +90,11 @@ if ${CMD_PREFIX} ostree --repo=repo refs foo/ctest --create=ctest; then
     assert_not_reached "refs --create unexpectedly succeeded in overwriting an existing prefix!"
 fi
 
+# Force overwriting ctest and check the revision got updated
+foo_ctest_rev=$(${CMD_PREFIX} ostree --repo=repo rev-parse foo/ctest)
+${CMD_PREFIX} ostree --repo=repo refs foo/ctest --create=ctest --force
+assert_ref repo ctest ${foo_ctest_rev}
+
 # https://github.com/ostreedev/ostree/issues/1285
 # One tool was creating .latest_rsync files in each dir, let's ignore stuff like
 # that.